home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / game / think / AmiChess.lha / AmiChess / src / swap.c < prev    next >
C/C++ Source or Header  |  2002-10-31  |  2KB  |  95 lines

  1. #include "common.h"
  2.  
  3. static const short xray[7]={ 0,1,0,1,1,1,0 };
  4.  
  5. short SwapOff(int move)
  6. {
  7. short f,t,sq,piece,side,xside,lastval;
  8. short swaplist[MAXPLYDEPTH],n;
  9. BitBoard b,c,*d,*e,r;
  10. f=FROMSQ(move);
  11. t=TOSQ(move);
  12. side=((board.friends[white]&BitPosArray[f])?white:black);
  13. xside=1^side;
  14. b=AttackTo(t,side);
  15. c=AttackTo(t,xside);
  16. CLEARBIT(b,f);
  17. if(xray[cboard[f]])
  18. AddXrayPiece(t,f,side,&b,&c);
  19. d=board.b[side];
  20. e=board.b[xside];
  21. if(move&PROMOTION)
  22.     {
  23.     swaplist[0]=Value[PROMOTEPIECE(move)]-ValueP;
  24.     lastval=-Value[PROMOTEPIECE(move)];
  25.     }
  26. else
  27.     {
  28.     swaplist[0]=(move&ENPASSANT?ValueP:Value[cboard[t]]);
  29.     lastval=-Value[cboard[f]];
  30.     }
  31. n=1;
  32. while(1)
  33.     {
  34.     if(c==NULLBITBOARD) break;
  35.     for(piece=pawn;piece<=king;piece++)
  36.         {
  37.         if(r=c&e[piece])
  38.             {
  39.             sq=leadz(r);
  40.             CLEARBIT(c,sq);
  41.             if(xray[piece]) AddXrayPiece(t,sq,xside,&c,&b);
  42.             swaplist[n]=swaplist[n-1]+lastval;
  43.             n++;
  44.             lastval=Value[piece];
  45.             break;
  46.             }
  47.         }
  48.     if(b==NULLBITBOARD) break;
  49.     for(piece=pawn;piece<=king;piece++)
  50.         {
  51.         if(r=b&d[piece])
  52.             {
  53.             sq=leadz(r);
  54.             CLEARBIT(b,sq);
  55.             if(xray[piece]) AddXrayPiece(t,sq,side,&b,&c);
  56.             swaplist[n]=swaplist[n-1]+lastval;
  57.             n++;
  58.             lastval=-Value[piece];
  59.             break;
  60.             }
  61.         }
  62.     }
  63.  
  64. --n;
  65. while(n)
  66.     {
  67.     if(n&1)
  68.         {
  69.         if(swaplist[n]<=swaplist[n-1]) swaplist[n-1]=swaplist[n];
  70.         }
  71.     else
  72.         {
  73.         if(swaplist[n]>=swaplist[n-1]) swaplist[n-1]=swaplist[n];
  74.         }
  75.     --n;
  76.     }
  77. return swaplist[0];
  78. }
  79.  
  80. void AddXrayPiece(short t,short sq,short side,BitBoard *b,BitBoard *c)
  81. {
  82. short dir,nsq,piece;
  83. BitBoard a;
  84. dir=directions[t][sq];
  85. a=Ray[sq][dir]&board.blocker;
  86. if(a==NULLBITBOARD) return;
  87. nsq=(t<sq?leadz(a):trailz(a));
  88. piece=cboard[nsq];
  89. if((piece==queen)||(piece==rook&&dir> 3)||(piece==bishop&&dir<4))
  90.     {
  91.     if(BitPosArray[nsq]&board.friends[side]) *b|=BitPosArray[nsq];
  92.     else *c|=BitPosArray[nsq];
  93.     }
  94. }
  95.